package packLigaDeFutbol;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

//import net.sf.jga.algorithms.Sort;  JGA

public class GestorEquipos {
	//ATRIBUTOS
	private static GestorEquipos mListaEquipos = null;
	private ArrayList<Equipo> lEquipos;

	//CONSTRUCTORA
	private GestorEquipos(){
		lEquipos = new ArrayList<Equipo>();
	}

	//METODOS	

	//Devuelve la lista de equipos
	public static GestorEquipos getGestorEquipos(){
		if (mListaEquipos == null){
			mListaEquipos = new GestorEquipos(); 
		}
		return mListaEquipos;
	}
	
	/**
	 * @author jonatanperez
	 * Carga todos los equipos almacenados en el sistema
	 */
	public ArrayList<Equipo> cargarEquipos() {
		Equipo[] equipos = null;
		int cont = 0;
		
		try {
			String strSQL = "SELECT nombre, idEquipo, provincia FROM equipo WHERE eliminado = 0";
			ResultSet resultado = Principal.BBDD.consulta(strSQL);
			if(resultado.last()) {				
				equipos = new Equipo[resultado.getRow()];
				resultado.first();
				do{
					String nombreEquipo = resultado.getString("nombre");
					int idEquipo = resultado.getInt("idEquipo");
					String provincia = resultado.getString("provincia");
					equipos[cont] = new Equipo(nombreEquipo, provincia);
					equipos[cont].setID(idEquipo);
					cont++;
				}while(resultado.next());
			}
		}
		catch (SQLException e){
			e.printStackTrace();
		}
		copiarArray(equipos);
		return lEquipos;
	}
	
	/**
	 * @author jonatanperez
	 * @param equipos
	 */
	private void copiarArray(Equipo[] equipos) {
		lEquipos.clear();
		for(int i = 0; i < equipos.length; i++) {
			lEquipos.add(equipos[i]);
		}
	}

	/**
	 * @author Lucia Rodero
	 * @return ResultSet
	 * Busca los jugadores del equipo en la base de datos a partir de una IdEquipo.
	 * @param idEquipo
	 */
	public ResultSet jugadoresEquipo(int pIdEquipo) {
		String str = "SELECT idjugador,nombreJug,dorsal FROM jugador WHERE idequipo = " + pIdEquipo + ";";
		ResultSet rs = null;
		try{
			rs = Principal.BBDD.consulta(str);
		}catch(SQLException e) {
			System.out.println(str);
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * @author Endika Serrano
	 * Obtiene un equipo en la base de datos a partir de una IdUsuario.
	 * @param idUsuario
	 */
	public int obtenerEquipoPorIDUsu(int pIdUsuario){
		
		String strSQL = "SELECT idEquipo FROM equipo WHERE idUsuario = " + pIdUsuario + ";";
		
		ResultSet rs;
		int equipo = 0;
		
		try {
			rs = Principal.BBDD.consulta(strSQL);
			if (rs.first()){
				equipo = rs.getInt("idEquipo");
			}	
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return equipo;
	}

	//Iterador para poder movernos en el vector de Equipos
	public Iterator<Equipo> getIterador(){
		return lEquipos.iterator();
	}
	
	/**
	 * @author Endika Serrano
	 * Obtiene un equipo en la base de datos a partir de una IdUsuario.
	 * @param idUsuario
	 */
	public ResultSet obtenerCalendarioEquipo(int pIdTemporada, int pIdUsuario) {
		
		ResultSet rs = null;
		
		String strSQL = "SELECT idpartido as id, e1.nombre AS Local, e2.nombre AS Visitante, p.fecha AS Fecha, a.nombre AS Arbitro " +
		"FROM equipo e1, equipo e2, partido p, usuarios u, arbitro a, jornada j " +
		"WHERE (p.idlocal = e1.idEquipo or p.idvisitante = e1.idEquipo) " +
		"AND (p.idlocal = e2.idEquipo or p.idvisitante = e2.idEquipo) " +
		"AND e1.idEquipo = p.idlocal " +
		"AND e2.idEquipo = p.idvisitante " +
		"AND a.idArbitro = p.idArbitro " +
		"AND (e1.idUsuario = u.idUsuario or e2.idUsuario = u.idUsuario) " +
		"AND j.idjornada = p.idjornada " +
		"AND j.idtemporada = "+ pIdTemporada + " " +
		"AND u.idusuario = "+ pIdUsuario +";";
		
		try {
			rs = GestorBD.getInstance().consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		
		return rs;
	}
	
	
	/**
	 * @author Endika Serrano
	 * Obtiene el numero de jugadores de un equipo a partir de la ID de equipo.
	 * @param idEquipo
	 */
	public int contarJugadoresEquipo(int pIdEquipo){
		
		String strSQL = "SELECT count(*) " +
						"FROM temporadaequipo JOIN jugador " +
						"WHERE temporadaequipo.idTemp = "+ GestorTemporadas.get().temporadaActual() + " " +
						"AND jugador.idequipo = " + pIdEquipo;
		
		ResultSet rs;
		int ret = -1;
		
		try {
			rs = Principal.BBDD.consulta(strSQL);
			if (rs.first()){
				ret = rs.getInt(1);
			}	
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return ret;
	}
	/**
	 * @author Bego*/
	public ResultSet obtenerTodoEquipos() {
		int ret = -1;
		ResultSet rs = null;
		try {
			rs = Principal.BBDD.consulta("SELECT a.idEquipo as id, a.nombre as Nombre, u.nombre as Usuario, u.email as Correo, a.provincia Provincia  " +
					"FROM equipo a, usuarios u " +
					"WHERE a.idUsuario = u.idUsuario " +
					"AND a.eliminado = false " +
					"order by a.nombre ASC " );

		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}
	/**
	 * @author Bego*/
	public boolean existeEquipo(String pNombre){
		ResultSet rs = null;
		boolean anadido = false;

		String strSQL= "SELECT * equipo where nombre = '" + pNombre +  " " +")";

		try {
			rs = Principal.BBDD.consulta(strSQL);
			anadido = true;
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return anadido;
	}
	/**
	 * @author Bego*/
	public int anadirEquipo(String nombre, String provincia, int idUsuario){
		ResultSet rs = null;
		int ret = -1;
		
		String strSQL= "INSERT INTO equipo(nombre, provincia, idUsuario) " +
					   "VALUES('" +
					   nombre + "', '" +
					   provincia + "', " +
					   idUsuario +
					   ")";
		
		try {
			if(!this.existeEquipo(nombre)){
			ret = Principal.BBDD.insertar(strSQL);}
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		
		return ret;
	}
	/**
	 * @author Bego*/
	public int anularEquipo(int pIdEquipo) {
		int ret = -1;
		ResultSet rs = null;
		try {
			Principal.BBDD.actualizar("UPDATE equipo "
					+ "SET eliminado = true "
					+ "WHERE idEquipo = " + pIdEquipo);
			ret = 1;

		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return ret;
	}
	/**
	 * @author Bego*/
	public int modificarEquipo(int pIdEquipo, String pNombre, String pProvincia) {
		int ret = -1;
		ResultSet rs = null;
		try {
			ret = Principal.BBDD.actualizar("UPDATE equipo "
					+ "SET nombre = '" + pNombre
					+ "' , provincia = '" + pProvincia
					+ " WHERE idEquipo = " + pIdEquipo);

		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return ret;
		
	}

	
	/**
	 * @author Asier
	 */
	
	public String nombreEquipo(int pIdEquipo) {
		String str = "SELECT nombre FROM equipo e WHERE e.idEquipo = " + pIdEquipo + ";";
		String result = "";
		try {
			ResultSet rs = Principal.BBDD.consulta(str);
			rs.first();
			result = rs.getString("nombre");
		} catch(SQLException e) {
			e.printStackTrace();
		}
		return result;
	}
}
